// let num:number = 10 ; 
// let str:string ='hello zf';
// let bool:boolean = true ; 



// let num1 :number =1 ; 
// let num2:Number =1 ;
// let num3 :number = Number(1)
// console.log(num3)
// let num4 :Number =new Number(1)

// const enum ROLE {
//     USER ,
//     ADMIN ,
//     MANAGER
// }
// console.log(ROLE.USER)

// class Animal {
//     private _name: string = 'Tom';

//     get name() { // 属性访问器 ---好处：可以通过这个访问私有属性，有点像代理 暴露方法访问属性
//         return this._name;
//     }
//     set name(name: string) {
//         this._name = name;
//     }
//     cc='a'
//     static b ='b'

// }
// let animal = new Animal();
// console.log(animal);


// function addSay1(a:string){
//     console.log(a) 
//     return function(target:any){
//         console.log(1)
//     }
// }
// function addSay2(b:string){
//     console.log(b)
//     return function(target:any){
//         console.log(2)
//     }
// }
// function addSay3(c:string){
//     console.log(c)
//     return function(target:any){
//         console.log(3)
//     }
// }
// // 有参数的情况执行顺序 a -> b->c ->3 ->2->1 看编译后的源码得出来的结论

// @addSay1('a1')
// @addSay2('a2')
// @addSay3('a3')



// class PerSon {
   
// }
// let person = new PerSon()
// function addSay(target:any){
//     target.prototype.say = function(){console.log('say')}
// }
// @addSay
// class Person {
//     say!:Function
// }
// let person = new Person
// person.say();

// function toUpperCase(target:any,key:string){
//     console.log(target)
//     console.log(key)
//     let value = target[key]; 
//     Object.defineProperty(target,key,{
//         get(){
//             return value.toUpperCase();
//         },
//         set(newValue){
//             value = newValue
//         }
//     })
// }
// function double(target: any, key: string) {
//     let value = target[key];
//     Object.defineProperty(target, key, {
//         get() {
//             return value * 2;
//         },
//         set(newValue) {value = newValue}
//     })
// }
// class Person {
//     @toUpperCase //实际name还没赋值，从下往下执行 
//     name: string = 'JiangWen'
// 	@double
//     static age: number = 10;
//     getName() {
//         return this.name;
//     }
// }
// let person = new Person();

let fn: any = () => {
    fn.count++;
    return fn.count;
}
fn()
console.log(fn)